#!/usr/bin/bash

# Важно! Используем утилиту GNU time вместо встроенной в bash
alias time='/usr/bin/time'

# Утилита GNU time поддерживает форматы
if [ "$1" == "-t" -o "$2" == "-t" -o "$3" == "-t" ]
then
	# Будем замерять время, если это необходимо
	tm="time --format=%S-%U"
else
	tm=""
fi

if [ "$1" == "-g" -o "$2" == "-g" -o "$3" == "-g" ]
then
	# Будем выполнять профилировку, если это необходимо
	# (никаких особенных данных от профилировщика не нужно - только информация о
	# возникших ошибках)
	valgrind="valgrind -q"
else
	valgrind=""
fi

if [ "$1" == "-v" -o "$2" == "-v" -o "$3" == "-v" ]
then
	# Будем выводить подробную информацию, если это необходимо
	verbose="verbose"
else
	verbose=""
fi

# flag считает количество неудачных тестов
flag=0

# Все файлы, на которых необходимо провести тестирование, должны называться:
# "example*"
for x in example*
do
	if [ "$verbose" == "verbose" ]
	then
		echo "####### [$x] ###################################"
	fi

	if [ "$valgrind" = "valgrind -q" ]
	then
		echo "------> Profiling compress [$x] <------"
	fi

	# Сжатие
	$valgrind $tm ./haffman_console -c $x $x.out

	if [ "$valgrind" = "valgrind -q" ]
	then
		echo "------> Profiling decompress [$x] <------"
	fi

	# Декомпрессия
	$valgrind $tm ./haffman_console -d $x.out $x.out.out

	# Вычисляем размер исходного файла
	size_B_b="`du -b0 $x | sed 's/\t.*//'`"
	size_B_h="`du -h0 $x | sed 's/\t.*//'`"
	# Вычисляем размер декомпрессированного файла
	size_UC_b="`du -b0 $x.out.out | sed 's/\t.*//'`"
	size_UC_h="`du -h0 $x.out.out | sed 's/\t.*//'`"
	# Вычисляем размер сжатого файла
	size_C_b="`du -b0 $x.out | sed 's/\t.*//'`"
	size_C_h="`du -h0 $x.out | sed 's/\t.*//'`"

	if [ "$verbose" == "verbose" ]
	then
		echo "------> [$x] <------"
		# Выводим подробную информацию о результатах тестов
		# Тип файла определяем с помощью file
		echo -e "\t[`file $x`]"
		echo -e "\tSize:\t\t\t$size_B_b\t$size_B_h\t$x"
		echo -e "\tDecompress size:\t$size_UC_b\t$size_UC_h\t$x.out.out"
		echo -e "\tCompress size:\t\t$size_C_b\t$size_C_h\t$x.out"
		if [ "$size_B_b" == "$size_UC_b" ]
		then
			echo -e "\t### TEST COMPLETED ###"
		else
			echo -e "\t### TEST FAIL ###"
		fi
		echo "------> END [$x] <------"
	fi
	
	# Если тест провалился, увеличим flag на единицу
	if [ "$size_B_b" != "$size_UC_b" ]
	then
		flag=`expr $flag + 1`
	fi

	# Удалим декомпрессированный файл и файл со сжатым содержимым
	rm -f $x.out $x.out.out

done

# Итог
if [ $flag == 0 ]
then
	echo "### All test completed! ###"
else
	echo "### Fail $flag test ###"
fi

# Теперь time является тем, чем и было до выполнения скрипта
unalias time

